<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<pre>
		参考地址：1.廖雪峰git https://www.liaoxuefeng.com/wiki/896043488029600/896067008724000
		2. 图文结合： https://blog.csdn.net/u010312474/article/details/90261496
		3. 官网 https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA
		4. 练习游戏 ： https://oschina.gitee.io/learn-git-branching/?NODEMO
		5. Git 提交错了不用慌，这三招帮你修改记录：rebase： https://mp.weixin.qq.com/s/xtol-m1QDJPlJE74cBUAeQ
	</pre>
	<pre>
		<img src="./img/20190817160450530.png" alt="">

	<h3>图片解析：</h3>
	2.git add <fileName>/.    
	// 添加到本地储存

	3.git commit -m 'xxx' //把本地存储存储在仓库，-m后面输入的是本次提交到仓库的说明
	前面讲了我们把文件往Git版本库里添加的时候，是分两步执行的：
	第一步是用git add把文件添加进去，实际上就是把文件修改添加到暂存区；
	第二步是用git commit提交更改，实际上就是把暂存区的所有内容提交到当前分支。

	4.git commit -am "xxx"

	版本回退reset 
		HEAD表示当前版本（也就是在当前分支你最近的一个提交），上一个版本就是HEAD^，上上一个版本就是HEAD^^
		{
			5.--soft：回退到某个版本，只回退了commit的信息，不会恢复到index file一级。如果还要提交，直接commit即可
			6.--mixed: 默认，不带任何参数时；它回退到某个版本，只保留 源码，回退commit和index（缓存区）信息
			7.--hard：彻底回退到某个版本，本地的源码也会变为上一个版本的内容
		}
		git reset [--hard | --soft | --mixed] "HEAD^" // 返回上一个版本
		或者 git reset [--hard | --soft | --mixed] commit_id(版本号)
		

	8.暂存区的修改回退到工作区
		git reset HEAD <fileName> 也可以把暂存区的修改回退到工作区

	9.丢弃工作区修改
		git checkout -- <filename> 这是保存了还没有操作git add ....
		工作修改还没放到stage区，撤销到工作区

	10.git checkout head 

	<hr>

	<h3>辅助命令：</h3>
	git init // 初始化一个git仓库
	git status //查看的状态
	git diff // 查看更改了那些内容 
	git log  [--pretty=oneline] //显示从最近到最远的提交日志 退出：q
	git log  --pretty=format:"%h %s" --graph //使用ASCII 图形显示分支与合并历史 退出：q
	git reflog // 查看命令历史 退出：q

	11.匿藏stash
	git stash save "save message" 执行存储时，添加备注，方便查找，只有git stash 也要可以的，但查找时不方便识别
	git stash list 查看stash列表
	git stash apply  应用某个存储,但不会把存储从存储列表中删除，默认使用第一个存储
	git stash pop 应用某个存储,会把存储从存储列表中删除，默认使用第一个存储
	git stash drop 丢弃stash@{$num}存储，从列表中删除这个存储
	git stash clear 删除所有缓存的stash
	
	说明:新增的文件，直接执行stash是不会被存储的：
	可以把新增的文件add，之后再执行stash


	12.删除文件 
		eg：把没用的del.html文件删了
		现在你有两个选择，一是确实要从本地存储中删除该文件，那就用命令git rm删掉，并且git commit：
		git rm del.html
		git commit -m "remove del.html"
		另一种情况是删错了，因为版本库里还有呢，所以可以很轻松地把误删的文件恢复到最新版本：
		git checkout -- del.html

	13.git 和 github的远程操作
	  	1) 在github上创建一个新的远程仓库
	 	2）将本地仓库和远程仓库相关联  git remote add origin https://github.com/wuyanping/gitLx.git
		 3）git push -u origin master 将本地仓库push到远程仓库上
		 4) 移除本地仓库关联的远程仓库： git remote remove origin
		 4）假如本地分支回退了几个版本，(本地库HEAD指向的版本比远程库的要旧)push不上去，强制推送
		<img src="./img/微信图片_20201105102700.png">
		<img src="./img/微信图片_20201105102621.png" width="800px">
		git push 推送失败
		<img src="./img/1.png">
		使用命令（强制推送）：git push -f
		 <img src="./img/push-f.png">

	12.从远程上克隆
		git clone https://github.com/wuyanping/gitskills2.git

	13.分支管理
	    1.创建和合并分支
	    	1.1)创建分支
	        git checkout -b dev //创建dev分支，然后切换到dev分支 -b参数表示创建并切换 
	        或者 <===>
	        git branch dev 
	        git checkout dev 
	        1.2)查看当前分支
	        git branch  //列出所有分支，当前分支前面会标一个*号
	        1.3)切换分支
	        git checkout master //切换回master分支
	        1.4)合并分支
	        git merge dev //在master分支上合并dev分支 
	        Fast-forward “快进模式”
	        1.5）删除分支
	        git branch -d dev //删除dev分支

	    2.解决冲突
	    	2.1）当发生从冲突了
	    	   2.1.1）修改冲突 
	    	   2.1.2）git add
	    	   2.1.3）git commit

		3.分支管理策略
			git merge --no-ff -m "merge with no-ff" dev 
			// 准备合并dev分支，请注意--no-ff参数，表示禁用Fast forward：
			git log --graph --pretty=oneline --abbrev-commit
			// git log看看分支历史：

		4.多人协作
			git remote [-v] //查看远程库信息[-v显示更详细的信息]
			给dev分支看的

			4.1）推送分支
			git push origin master 该分支推送到远程库对应的远程分支上
			git push origin dev

			4.2）tag标签
			$ git log --pretty=oneline --abbrev-commit //找到历史提交的commit id
			{
				$ git tag v0.9 id ||
			    $ git tag -a v0.1 -m "version 0.1 released" 3628164 //创建带有说明的标签，用-a指定标签名，-m指定说明文字：
			    git tag -s v0.2 -m "signed version 0.2 released" fec145a //通过-s用私钥签名一个标签：
		    }
			git show <tagname> //查看标签信息：
			$ git tag -d v0.1 //删除：
			$ git push origin <tagname> //推送某个标签到远程
			git push origin --tags //一次性推送全部尚未推送到远程的本地标签：
			
			4.3)删除远程标签
			git tag -d v0.9 //先从本地删除：
			$ git push origin :refs/tags/v0.9   //然后，从远程删除。删除命令也是push，
			$ git push origin -d </tagname>

		5.修改记录
		参考：<a href="./img/Git 提交错了不用慌，这三招帮你修改记录.html">Git 提交错了不用慌，这三招帮你修改记录.html</a>
			5.1 修改最后一次提交
			git commit --amend	
			amend 的意思是补丁，它可以把我们这一次的修改合并到上一条历史记录当中，而不会产生一个新的 commit 记录。运行之后，它会打开一个 vim 编辑器，我们还可以修改上一次 commit 时输入的提示信息。
			<img src="./img/amend.png">

			5.2修改多个信息
			--amend 虽然好用，但是它只能修改最后一次的提交信息，如果我们想要修改的提交记录在那之前，我们应该怎么办呢？
			git 当中并没有提供直接的工具来实现这一点，不过我们可以使用 rebase 来达成。我们可以加上-i进行交互式地变基，我们可以在任何想要的修改完成之后停止，也可以添加文件或者是做其他想要做的事情。但是我们变基的目标不是某一个分支而是当前分支的某一个历史节点，所以我们需要提供一个具体的 commitid 或者是指针位置。
			git rebase -i 的功能非常强大，我们几乎可以使用它来完成所有一切我们想要完成的事情。
			比如我们想要修改倒数第二次提交，我们可以执行 git rebase -i HEAD~3。也就是以倒数第三个节点作为基准节点执行变基，这时候git会进入一个vim窗口，在这个窗口当中我们可以看到最近的三次提交记录。
			<img src="./img/reabase~.png">
			首先我们可以看到上面的三行就是我们可以修改的三个 commit，分别展示的是要执行的操作以及 commitid 以及 commit message。这里的操作默认的是 pick，也就是使用该 commit。关于我们可以执行的操作 git 在下方也给了充分的提示，其中比较常用的有 pick、edit 以及 squash。
			这一次我们想要做的是修改提交记录，所以我们应该执行 edit，我们把想要修改的 commit 前的 pick 改成 edit。
			<img src="./img/edit.png" alt="">

			退出之后，git 会自动带我们回到我们选择edit的分支提交之后的版本。我们进行我们想要的修改。之后再使用 git add 以及 git commit --amend 进行修改提交结果。
			<img src="./img/rebase2.png" alt="">
			再之后我们执行 git rebase --continue，把剩下要应用的变更应用完成。

			5.3顺序变更、合并、拆分

			最后的最后，大家需要注意，虽然这些手段在修改记录的时候非常好用。但是如果这些 commit 已经被提交到了远程，我们是不可以直接 git push 同步的。因为 git 会校验我们提交的 hash 值，发现对不上之后会禁止我们的提交。所以如果想要提交到远程的话，只能使用 git push -f 强制覆盖。但是这是一个非常非常危险的操作，如果你 git push -f 了，没有人会知道你到底修改了什么，只建议在自己独有的分支上如此操作，一定一定要谨慎使用。
			
		
		6.rebase想恢复
		<img src="./img/rebase恢复.png">
			
		</pre>
</body>
</html>